<?php
// Classe que aguarda um tempo aleatorio e depois imprime algo na tela
class AguardaRand extends Thread {

    // ID da thread (usado para identificar a ordem que as threads terminaram)
    protected $id;

    // Construtor que apenas atribui um ID para identificar a thread
    public function __construct($id) { 
        $this->id = $id;
    }

    // Metodo principal da thread, que sera acionado quando chamarmos "start"
    public function run() {
        // Sortear um numero entre 1 e 4
        $tempo_rand = mt_rand(1, 4);

        // Aguardar o tempo sorteado
        sleep($tempo_rand);

        // Imprimir quem e' a thread e quanto tempo ela aguardou
        printf(
            "Sou a thread %d e aguardei %d segundos\n",
            $this->id,
            $tempo_rand
        );
    }
}

/// Execucao do codigo

// Criar um vetor com 10 threads do mesmo tipo
$vetor = array();
for ($id = 0; $id < 10; $id++) {
    $vetor[] = new AguardaRand($id);
}

// Iniciar a execucao das threads
foreach ($vetor as $thread) {
    $thread->start();
}

// Encerrar o script
exit(0);
/* -------------------------------------------1º exemplo
 * Retirando links href dos links "1º forma"
 *  Puxa o codigo fonte da pagina
 *  Armazena
 *  Refaz os caracteres especiais
 *  Retira os links
 */
/*

  //Site a ser buscado
  $site = 'www.uol.com.br';

  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $site);
  //curl_setopt($ch, CURLOPT_HEADER, true);//Cabeçalho/header de informações
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //Nega verificação do HTTPS
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_REFERER, '');
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
  curl_setopt($ch, CURLOPT_ENCODING, $str_charset);
  $str_codigoFonteSite = curl_exec($ch);

  //Puxando o codigo com a função "file_get_contents"
  //  $str_codigoFonteSite= file_get_contents($site);

  //Retira caracteres especiais
  $str_codigoFonteSiteReparado = html_entity_decode(htmlspecialchars($str_codigoFonteSite));

  //Criando o objeto DOM
  $dom1 = new DOMDocument('1.0');

  //O '@' suprime os erros desse paso
  @$dom1->loadHTML($str_codigoFonteSiteReparado);

  //Retirando os links
  $links = $dom1->getElementsByTagName('a');

  //Contador de resultados
  $int_cont1 = 0;
  $str_numero;
  //Percorrendo os links e retirando o atributo href
  foreach ($links as $link) {

  $str = $link->getAttribute('href');
  $str_numero = '(' . $int_cont1 . ') '; //Numero de inicio da linha
  //Caso não contenha "?" no links e tenha conteudo exibe
  if (!(strpos($str, '?')) && $str != '') {
  echo $str_numero . $link->getAttribute('href') . PHP_EOL . '<br>';
  }
  $int_cont1+=1;
  }
  echo 'Total de links sem "?" referente a query de pesquisa:' . $int_cont1 . '<br>';

 */


/* -------------------------------------------2º exemplo
 * Retirando links href dos links "2º forma"
 *  Puxa o codigo fonte da pagina
 *  Armazena
 *  Refaz os caracteres especiais
 *  Retira os links
 */

/*
  //Site a ser buscado
  $site = 'http://www.uol.com.br';

  $dom2 = new DOMDocument('1.0');
  @$dom2->loadHTMLFile($site);

  //Retirando os links
  $links2 = $dom2->getElementsByTagName('a');
  $int_cont_link = 0;

  //Numero de inicio da linha
  $str_numero;

  //Percorrendo o array de links
  foreach ($links2 as $link) {
  $str_ref = $link->getAttribute('href');
  $str_numero='('.$int_cont_link .') ';

  //Verifica se contem o simbolo ? na referência retirada no link
  if (!(strpos($str_ref, '?')) && $str_ref!='') {
  //echo $str_numero . $link->getAttribute('href') . PHP_EOL . '<br>';
  }
  $int_cont_link+=1;
  }
  echo 'Total de links sem "?" referente a query de pesquisa:' . $int_cont_link . '<br>';
 */

/* ----------------------------------------------------
 * Procurando charset dos content dos metas 
 *  Retira todos os content dos metas
 *  Procura alguma que contenha o conteudo charset
 *  Retira e exiba
 */

/*
  //`Pegando os metas de tudo
  echo '<hr><hr>METAS<br>Retirando os metas da pagina<br>';

  //Site a ser buscado
  $site = 'http://www.uol.com.br';

  $dom2 = new DOMDocument('1.0');
  @$dom2->loadHTMLFile($site);

  $metas = $dom2->getElementsByTagName('meta');
  $charset = '';

  //Procurando o charset da pagina
  foreach ($metas as $meta) {
  $metaConteudo = $meta->getAttribute('content');

  //Procura o contente que contem o charset
  $int_posic = (strpos($metaConteudo, 'charset='));

  //Caso encontre o charset o 1-copia do codigo 2-guarda e 3-finaliza o for
  if ($int_posic != '') {
  $charset = substr($metaConteudo, $int_posic + 8, \strlen($metaConteudo));
  break;
  }
  }
  echo 'O charset e ' . $charset;
 */


/* ----------------------------------------------------
 * Procurando todas imagens das tags img 
 */

/*
  $site = 'http://www.uol.com.br';

  $dom = new DOMDocument('1.0');
  @$dom->loadHTMLFile($site);
  $elem = 'img';

  $links = $dom->getElementsByTagName($elem);

  foreach ($links as $link) {
  $str_ref = $link->getAttribute('src');
  echo "<img src=\"$str_ref\" width=\"150\" height=\"150\" /><br>";
  }
 */
/*
 * Retira todas tags deixando só as palavras
 */

/*
  //crawler
  function RefinarPalavras($str_par_Codigo) {

  $arr_padroes1 = array(
  '/((<!--)(.*?)(-->))/sim', //Comentarios: <!-- ... -->
  '/((<!)(.*?)(>))/sim', //Doctype <!DOCTYPE html>
  '/((\/\*)(.*?)(\*\/))/sim', //Comentarios /* ... * /
  '/((<script(.*?)*>)(.*?)(<\/script>))/sim', //tag scripts
  '/((<noscript(.*?)?>)(.*?)(\/noscript>))/sim', //tag: <noscript>...</noscript>
  '/((<style(.*?)?>)(.*?)(\/style>))/sim', //tag <style>...</style>
  '/((<(\/{0,1})[a-zA-Z0-9]*)(.*?)(>|\/>))/sim', //tag scripts
  '/[\n\r\t]/sim', //Formatações: \n\r\t
  '/(&nbsp;)/sim', //char esecial espaço
  '/\s{1}\s{1,}/sim'); //Espaços duplos seguidos: "_"__"
  //converte e traduz a codação
  $str_par_Codigo = html_entity_decode(htmlspecialchars($str_par_Codigo));

  $str_par_Codigo = (trim(preg_replace($arr_padroes1, ' ', $str_par_Codigo)));

  //convertendo para caracteres legiveis
  $str_par_Codigo = htmlentities($str_par_Codigo);

  //Quebrando nos espaços e guardando em array
  //$arr_par_palavras = preg_split('/ /sim', ($str_par_Codigo), -1);
  $arr_par_palavras = explode(' ', $str_par_Codigo);

  echo '<br>Metodo: ExibirPalvras <br>';
  echo 'Itens achados : ' . count($arr_par_palavras) . '<br><br>';
  echo '<pre>';

  //  print_r($arr_par_palavras);
  $int_qtdPalavras = count($arr_par_palavras);
  for ($index = 0; $index < $int_qtdPalavras; $index++) {
  echo 'indice: ' . $index . '  -  ' . $arr_par_palavras[$index] . '<br>';
  }

  echo '</pre><hr>';
  }
 */

/*
 * Testando FLUSH
 */
/*
  if (ob_get_level() == 0)
  ob_start();
  for ($i = 0; $i < 20; $i++) {
  echo 'printing...<br />';
  echo str_pad('', 4096) . "\n";
  ob_flush();
  flush();
  usleep(300000);
  } ob_end_flush();
  ?>

 */
/*
 * Contar tempo de execução
 */
/*
function tempoExecucao($start = null) {
    // Calcula o microtime atual
    $mtime = microtime(); // Pega o microtime
    $mtime = explode(' ', $mtime); // Quebra o microtime
    $mtime = $mtime[1] + $mtime[0]; // Soma as partes montando um valor inteiro

    if ($start == null) {
        // Se o parametro não for especificado, retorna o mtime atual
        return $mtime;
    } else {
        // Se o parametro for especificado, retorna o tempo de execução
        return round(($mtime - $start), 2);
    }
}

*/